﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;

namespace WAD.WEB.AppCode.Pay.AlipayFk
{
    public class AlipayFkUtil
    {
        /// <summary>
        /// 支付宝付款账号
        /// </summary>
        private const String ALIPAY_ACOUNT = "wanghui@711688.cn";

        /// <summary>
        /// 支付宝付款方名称
        /// </summary>
        private const String ACCOUNT_NAME = "深圳企动网络有限公司";

        /// <summary>
        /// 开始付款
        /// API文档：https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.flys3k&treeId=64&articleId=103569&docType=1
        /// </summary>
        /// <param name="notifyUrl">回调通知</param>
        /// <param name="batchNo">批次号,格式：当天日期[8位]+序列号[3至16位]，如：201008010000001</param>
        /// <param name="userList">收款人列表</param>
        /// <returns>拼接的html表单部分代码</returns>
        public static String Pay(String notifyUrl, String batchNo, List<AlipayFkModel> userList)
        {
            if (userList.Count > 1000)
            {
                //最大操作数不能超过1000人
                throw new Exception("最大操作数不能超过1000人");
            }

            double totalMoney = 0.0;
            StringBuilder sb = new StringBuilder();

            //计算总额和拼接批次信息
            foreach (AlipayFkModel m in userList)
            {
                totalMoney += m.Money;
                sb.Append(m.SerialNumber).Append("^").Append(m.AlipayAcount).Append("^").Append(m.AlipayName).Append("^").Append(m.Money).Append("^").Append(m.Remark);
                sb.Append('|');
            }

            //去掉最后一个"|"
            sb.Length = sb.Length - 1;

            ////////////////////////////////////////////请求参数////////////////////////////////////////////

            //服务器异步通知页面路径
            string notify_url = notifyUrl;
            //需http://格式的完整路径，不允许加?id=123这类自定义参数

            //付款账号
            string email = ALIPAY_ACOUNT;
            //必填

            //付款账户名
            string account_name = ACCOUNT_NAME;
            //必填，个人支付宝账号是真实姓名公司支付宝账号是公司名称

            //付款当天日期
            string pay_date = DateTime.Now.ToString("yyyyMMdd");
            //必填，格式：年[4位]月[2位]日[2位]，如：20100801

            //批次号
            string batch_no = batchNo;// "20160222" + DateTime.Now.ToString("yyyyMMddHHmmss");
            //必填，格式：当天日期[8位]+序列号[3至16位]，如：201008010000001

            //付款总金额
            string batch_fee = totalMoney.ToString();
            //必填，即参数detail_data的值中所有金额的总和

            //付款笔数
            string batch_num = userList.Count.ToString();
            //必填，即参数detail_data的值中，“|”字符出现的数量加1，最大支持1000笔（即“|”字符出现的数量999个）

            //付款详细数据
            string detail_data = sb.ToString();
            //必填，格式：流水号1^收款方帐号1^真实姓名^付款金额1^备注说明1|流水号2^收款方帐号2^真实姓名^付款金额2^备注说明2....


            ////////////////////////////////////////////////////////////////////////////////////////////////

            //把请求参数打包成数组
            SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
            sParaTemp.Add("partner", Config.Partner);
            sParaTemp.Add("_input_charset", Config.Input_charset.ToLower());
            sParaTemp.Add("service", "batch_trans_notify");
            sParaTemp.Add("notify_url", notify_url);
            sParaTemp.Add("email", email);
            sParaTemp.Add("account_name", account_name);
            sParaTemp.Add("pay_date", pay_date);
            sParaTemp.Add("batch_no", batch_no);
            sParaTemp.Add("batch_fee", batch_fee);
            sParaTemp.Add("batch_num", batch_num);
            sParaTemp.Add("detail_data", detail_data);

            //建立请求
            string sHtmlText = Submit.BuildRequest(sParaTemp, "get", "确认");
            return sHtmlText;
        }
    }
}